package com.summer.socket.http;

import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpServerCodec;

/**
 * netty channel 初始化器，channel 注册后，会执行里面的相应的初始化方法
 */
public class HttpServerInitializer extends ChannelInitializer<SocketChannel> {

    /**
     * 注册频道后将调用此方法。方法返回后，此实例将从 Channel 的 ChannelPipeline 中删除。
     * 这个方法会在两个地方被调用，一个是 {@link ChannelHandler#handlerAdded(ChannelHandlerContext)} 另一个 fireChannelRegistered 中被调用。
     *
     * @param channel 已注册的 channel
     */
    @Override
    protected void initChannel(SocketChannel channel) throws Exception {
        // 通过 SocketChannel 获得对应的管道（pipeline)，netty 为通道（Channel）进行了一次包装封装，并且提供了对应的处理链这里叫管道（pipeline）
        ChannelPipeline pipeline = channel.pipeline();
        // 为管道添加 handler（为责任链增加拦截器处理）
        pipeline.addLast("HttpServerCodec", new HttpServerCodec()); // HttpServerCodec 是由 netty 提供的通道处理器类，他实现了 Http 的编解码器功能

        pipeline.addLast("CustomHandler", new HttpHandler());
    }
}
